package com.lnt.spring.metadata;

/**
 * @title : Spring底层源码读取器
 * @createDate : 2021-11-13 15:15
 * @creater : LuNanTing
 * @className : MetaDataTest
 */

import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;

import java.io.IOException;

/**
 * 在Spring中需要去解析类的信息，比如类的名字，类中的方法，类上的注解，这些都可以称之为类的元数据，
 * 所以Spring中对类的元数据做了抽象，并提供了一些工具类
 */
public class MetaDataTest {

    public static void main(String[] args) throws IOException {
        SimpleMetadataReaderFactory simpleMetadataReaderFactory = new SimpleMetadataReaderFactory();
        //构造一个MetadataReader
        /**
         * MetadataReader表示的是类的元数据读取器，默认实现类是SimpleMetadataReader
         */
        MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader("com.lunanting.AppConfig");

        // 得到一个ClassMetadata，并获得了类名
        ClassMetadata classMetadata = metadataReader.getClassMetadata();

        System.out.println("className: " + classMetadata.getClassName());
        for (String interfaceName : classMetadata.getInterfaceNames()) {
            System.out.println("接口: " + interfaceName);
        }
        // 获取内部类
        for (String memberClassName : classMetadata.getMemberClassNames()) {
            System.out.println("内部类: " + memberClassName);
        }
        // 获取一个annotationMetadata，并获取类上的注解
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();

        for (String annotationType : annotationMetadata.getAnnotationTypes()) {
            System.out.println("annotationType: " + annotationType);
        }
    }

}
